package com.atguigu.userprofile.controller;


import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.atguigu.userprofile.bean.TagCondition;
import com.atguigu.userprofile.bean.TaskInfo;
import com.atguigu.userprofile.bean.UserGroup;
import com.atguigu.userprofile.service.UserGroupService;
import com.atguigu.userprofile.utils.RedisUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import io.swagger.annotations.ApiOperation;
import org.apache.catalina.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.Date;
import java.util.List;

/**


 画像总结: https://yt6m7m2sn5.feishu.cn/mindnotes/bmncnpM9X71JEtgmGekACw81vEg


 */
@RestController
public class UserGroupController {

    @Autowired
    UserGroupService userGroupService;

    @RequestMapping("/user-group-list")
    @CrossOrigin
    public String  getUserGroupList(@RequestParam("pageNo")int pageNo , @RequestParam("pageSize") int pageSize){
        int startNo=(  pageNo-1)* pageSize;
        int endNo=startNo+pageSize;

        QueryWrapper<UserGroup> queryWrapper = new QueryWrapper<>();
        int count = userGroupService.count(queryWrapper);

        queryWrapper.orderByDesc("id").last(" limit " + startNo + "," + endNo);
        List<UserGroup> userGroupList = userGroupService.list(queryWrapper);

        JSONObject jsonObject = new JSONObject();
        jsonObject.put("detail",userGroupList);
        jsonObject.put("total",count);

        return  jsonObject.toJSONString();
    }

    /*
            前台传递的是json格式的参数
                接收：
                        POJO
                        Map

        ----------------------------
        ①接收参数，补充参数中缺失的属性
                id： 写入数据，让数据库自动生成
                conditionJsonStr： 把UserGroup的List<TagCondition> tagConditions 转为json格式
                conditionComment： 把用户的条件拼接为一个字符串。 UserGroup.conditionJsonToComment 生成
                userGroupNum： 需要在ck中计算后得到
                updateTime：   在更新时生成，第一次插入时，无需生成
                createTime：   在程序中生成

        ②UserGroup中的信息属于元数据，需要存入mysql的userGroup表中
                执行完后，就拥有了自增的id

        ③基于CK中初步分群的基础计算分群的人群包，计算的结果，需要存储到ck中
                先建表
                有了自增的id,再写入数据,才能得到分群包的人数
        ④需要查询ck，获取分群的人数
                更新UserGroup中的userGroupNum，再写入mysql
     */
    @PostMapping(value = "/user-group")
    public Object handleUserGroup(@RequestBody UserGroup userGroup){


        //补充信息，写入mysql。为了先获取自增的id。
        // 使用mybatisPlus，将对象写入到表后，如果是自增id，id会自动回传给对象
        userGroupService.writeUserGroupToMysql(userGroup);

        // 将条件进行计算，将计算结果保存到ck的user_group表中
        userGroupService.saveUserGroupToCk(userGroup);

        // 将分群包同步到redis一份，应对高qps查询
        UserGroup ug = userGroupService.saveUserGroupToRedis(userGroup);

        // 更新含有userGroupNum的UserGroup
        userGroupService.saveOrUpdate(ug);

        return "ok";

    }

    @PostMapping(value = "/user-group-evaluate")
    public Object evaluateUserGroupNum(@RequestBody UserGroup userGroup){

        Integer userGroupNum = userGroupService.evaluateUserGroupNum(userGroup);

        return userGroupNum;

    }

    @PostMapping(value = "/user-group-refresh/{id}")
    public Object updateUserGroup(String busiDate,@PathVariable("id") String userGroupId){

        //根据userGroupId，查询mysql的元数据，封装为UserGroup对象，才能去更新ck
        UserGroup userGroup = userGroupService.getById(userGroupId);

        //额外计算 busiDate，tagConditions
        userGroup.setBusiDate(busiDate);
        userGroup.setTagConditions(JSON.parseArray(userGroup.getConditionJsonStr(),TagCondition.class));

        //更新ck中的人群包 ①删除之前的  ②写入当前的
        userGroupService.updateUserGroup(userGroup);

        //更新redis中的缓存。 从ck中查询当前最新的人群包，可能ck还尚未删除旧的人群包，因此需要把查询的结果手动执行final合并，保证只会查询到最新的人群包
        UserGroup up = userGroupService.saveUserGroupToRedis(userGroup);
        //放入更新时间
        up.setUpdateTime(new Date());

        //更新Mysql中的元数据信息
        userGroupService.saveOrUpdate(up);

        return "ok";

    }





}

